1796ab
@@ -23,6 +23,7 @@
import org.apache.camel.Message;
 import org.apache.camel.impl.DefaultProducer;
 import org.apache.camel.util.ExchangeHelper;
 import org.apache.camel.util.ObjectHelper;
+import org.apache.ibatis.mapping.MappedStatement;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
 import org.slf4j.Logger;
@@ -105,7 +106,7 @@
public class MyBatisProducer extends DefaultProducer {
             result = session.selectOne(statement);
         }
 
-        doProcessResult(exchange, result);
+        doProcessResult(exchange, result, session);
     }
 
     private void doSelectList(Exchange exchange, SqlSession session) throws Exception {
@@ -119,7 +120,7 @@
public class MyBatisProducer extends DefaultProducer {
             result = session.selectList(statement);
         }
 
-        doProcessResult(exchange, result);
+        doProcessResult(exchange, result, session);
     }
 
     private void doInsert(Exchange exchange, SqlSession session) throws Exception {
@@ -132,12 +133,12 @@
public class MyBatisProducer extends DefaultProducer {
                 Object value = iter.next();
                 LOG.trace("Inserting: {} using statement: {}", value, statement);
                 result = session.insert(statement, value);
-                doProcessResult(exchange, result);
+                doProcessResult(exchange, result, session);
             }
         } else {
             LOG.trace("Inserting using statement: {}", statement);
             result = session.insert(statement);
-            doProcessResult(exchange, result);
+            doProcessResult(exchange, result, session);
         }
     }
 
@@ -148,11 +149,11 @@
public class MyBatisProducer extends DefaultProducer {
             // just pass in the body as Object and allow MyBatis to iterate using its own foreach statement
             LOG.trace("Inserting: {} using statement: {}", in, statement);
             result = session.insert(statement, in);
-            doProcessResult(exchange, result);
+            doProcessResult(exchange, result, session);
         } else {
             LOG.trace("Inserting using statement: {}", statement);
             result = session.insert(statement);
-            doProcessResult(exchange, result);
+            doProcessResult(exchange, result, session);
         }
     }
 
@@ -166,12 +167,12 @@
public class MyBatisProducer extends DefaultProducer {
                 Object value = iter.next();
                 LOG.trace("Updating: {} using statement: {}", value, statement);
                 result = session.update(statement, value);
-                doProcessResult(exchange, result);
+                doProcessResult(exchange, result, session);
             }
         } else {
             LOG.trace("Updating using statement: {}", statement);
             result = session.update(statement);
-            doProcessResult(exchange, result);
+            doProcessResult(exchange, result, session);
         }
     }
 
@@ -182,11 +183,11 @@
public class MyBatisProducer extends DefaultProducer {
             // just pass in the body as Object and allow MyBatis to iterate using its own foreach statement
             LOG.trace("Updating: {} using statement: {}", in, statement);
             result = session.update(statement, in);
-            doProcessResult(exchange, result);
+            doProcessResult(exchange, result, session);
         } else {
             LOG.trace("Updating using statement: {}", statement);
             result = session.update(statement);
-            doProcessResult(exchange, result);
+            doProcessResult(exchange, result, session);
         }
     }
 
@@ -200,12 +201,12 @@
public class MyBatisProducer extends DefaultProducer {
                 Object value = iter.next();
                 LOG.trace("Deleting: {} using statement: {}", value, statement);
                 result = session.delete(statement, value);
-                doProcessResult(exchange, result);
+                doProcessResult(exchange, result, session);
             }
         } else {
             LOG.trace("Deleting using statement: {}", statement);
             result = session.delete(statement);
-            doProcessResult(exchange, result);
+            doProcessResult(exchange, result, session);
         }
     }
 
@@ -216,15 +217,15 @@
public class MyBatisProducer extends DefaultProducer {
             // just pass in the body as Object and allow MyBatis to iterate using its own foreach statement
             LOG.trace("Deleting: {} using statement: {}", in, statement);
             result = session.delete(statement, in);
-            doProcessResult(exchange, result);
+            doProcessResult(exchange, result, session);
         } else {
             LOG.trace("Deleting using statement: {}", statement);
             result = session.delete(statement);
-            doProcessResult(exchange, result);
+            doProcessResult(exchange, result, session);
         }
     }
 
-    private void doProcessResult(Exchange exchange, Object result) {
+    private void doProcessResult(Exchange exchange, Object result, SqlSession session) {
         if (endpoint.getStatementType() == StatementType.SelectList || endpoint.getStatementType() == StatementType.SelectOne) {
             Message answer = exchange.getIn();
             if (ExchangeHelper.isOutCapable(exchange)) {
@@ -232,8 +233,23 @@
public class MyBatisProducer extends DefaultProducer {
                 // preserve headers
                 answer.getHeaders().putAll(exchange.getIn().getHeaders());
             }
-            // set the result as body for insert
-            answer.setBody(result);
+
+            // we should not set the body if its a stored procedure as the result is already in its OUT parameter
+            MappedStatement ms = session.getConfiguration().getMappedStatement(statement);
+            if (ms != null && ms.getStatementType() == org.apache.ibatis.mapping.StatementType.CALLABLE) {
+                if (result == null) {
+                    LOG.trace("Setting result as existing body as MyBatis statement type is Callable, and there was no result.");
+                    answer.setBody(exchange.getIn().getBody());
+                } else {
+                    // set the result as body for insert
+                    LOG.trace("Setting result as body: {}", result);
+                    answer.setBody(result);
+                }
+            } else {
+                // set the result as body for insert
+                LOG.trace("Setting result as body: {}", result);
+                answer.setBody(result);
+            }
 
             answer.setHeader(MyBatisConstants.MYBATIS_RESULT, result);
             answer.setHeader(MyBatisConstants.MYBATIS_STATEMENT_NAME, statement);
